package 双指针三指针;
import java.util.*;
/**
 * 该类用于计算给定高度数组中的最大面积。
 * 提供两种方法：双指针法和双重循环法。
 */
public class maxArea {
    /**
     * 使用双指针法计算最大面积。
     * 该方法通过移动左右指针来寻找最大面积。
     * @param height 高度数组
     * @return 最大面积
     */
    public int maxArea1(int[] height) {
        int max = 0; // 初始化最大面积
        int i = 0; // 左指针
        int j = height.length - 1; // 右指针
        while(i < j) { // 当左指针小于右指针时继续循环
            int w = j - i; // 计算宽度
            int h = 0; // 初始化高度
            if(height[i] > height[j]) { // 如果左指针的高度大于右指针的高度
                h = height[j]; // 取右指针的高度
                max = Math.max(max, w * h); // 更新最大面积
                j--; // 右指针左移
            } else { // 如果左指针的高度小于等于右指针的高度
                h = height[i]; // 取左指针的高度
                max = Math.max(max, w * h); // 更新最大面积
                i++; // 左指针右移
            }
        }
        return max; // 返回最大面积
    }

    /**
     * 使用双重循环法计算最大面积。
     * 该方法通过遍历所有可能的左右指针组合来寻找最大面积。
     * @param height 高度数组
     * @return 最大面积
     */
    public int maxArea2(int[] height) {
        int max = 0; // 初始化最大面积
        for(int i = 0; i < height.length; i++) { // 遍历左指针
            for(int j = height.length - 1; j > i; j--) { // 遍历右指针
                int w = j - i; // 计算宽度
                int h = height[i] > height[j] ? height[j] : height[i]; // 取左右指针中较小的高度
                max = Math.max(max, w * h); // 更新最大面积
            }
        }
        return max; // 返回最大面积
    }

    /**
     * 主方法，处理输入并输出结果。
     * 该方法从标准输入读取高度数组，并输出最大面积。
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 创建扫描器对象
        String[] s = sc.nextLine().split(","); // 读取高度数组
        int height[] = new int[s.length]; // 创建高度数组
        for(int i = 0; i < s.length; i++) {
            height[i] = Integer.parseInt(s[i]); // 解析高度数组
        }
        maxArea ma = new maxArea(); // 创建对象
        System.out.println("two for:" + ma.maxArea2(height)); // 输出双重循环法的结果
        System.out.println("while:" + ma.maxArea1(height)); // 输出双指针法的结果
        sc.close(); // 关闭扫描器
    }
}
